static void vga_draw_graphic(VGAState *s, int full_update)
{
int y1, y, update, linesize, y_start, double_scan, mask, depth;
- int width, height, shift_control, line_offset, bwidth, changed_flag;
+ int width, height, shift_control, line_offset, bwidth, ds_depth;
ram_addr_t page0, page1;
int disp_width, multi_scan, multi_run;
uint8_t *d;
s->get_resolution(s, &width, &height);
disp_width = width;
- changed_flag = 0;
+ ds_depth = s->ds->depth;
depth = s->get_bpp(s);
if (s->ds->dpy_colourdepth != NULL &&
- (s->ds->depth != depth || !s->ds->shared_buf)) {
+ (ds_depth != depth || !s->ds->shared_buf))
s->ds->dpy_colourdepth(s->ds, depth);
- changed_flag = 1;
- }
+ if (ds_depth != s->ds->depth) full_update = 1;
+
s->rgb_to_pixel =
rgb_to_pixel_dup_table[get_depth_index(s->ds)];
}
vga_draw_line = vga_draw_line_table[v * NB_DEPTHS + get_depth_index(s->ds)];
- if (disp_width != s->last_width ||
+ if (s->line_offset != s->last_line_offset ||
+ disp_width != s->last_width ||
height != s->last_height) {
dpy_resize(s->ds, disp_width, height, s->line_offset);
s->last_scr_width = disp_width;
s->last_scr_height = height;
s->last_width = disp_width;
s->last_height = height;
+ s->last_line_offset = s->line_offset;
full_update = 1;
- changed_flag = 1;
}
- if (s->ds->shared_buf && (changed_flag || s->ds->data != s->vram_ptr + (s->start_addr * 4)))
+ if (s->ds->shared_buf && (full_update || s->ds->data != s->vram_ptr + (s->start_addr * 4)))
s->ds->dpy_setdata(s->ds, s->vram_ptr + (s->start_addr * 4));
if (!s->ds->shared_buf && s->cursor_invalidate)
s->cursor_invalidate(s);
s->vram_offset = vga_ram_offset;
s->vram_size = vga_ram_size;
s->ds = ds;
+ ds->palette = s->last_palette;
s->get_bpp = vga_get_bpp;
s->get_offsets = vga_get_offsets;
s->get_resolution = vga_get_resolution;
uint32_t line_compare; \
uint32_t start_addr; \
uint32_t plane_updated; \
+ uint32_t last_line_offset; \
uint8_t last_cw, last_ch; \
uint32_t last_width, last_height; /* in chars or pixels */ \
uint32_t last_scr_width, last_scr_height; /* in pixels */ \
glPixelStorei(GL_UNPACK_LSB_FIRST, 1);
switch (ds->depth) {
case 8:
- tex_format = GL_RGB;
- tex_type = GL_UNSIGNED_BYTE_3_3_2;
- glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ if (ds->palette == NULL) {
+ tex_format = GL_RGB;
+ tex_type = GL_UNSIGNED_BYTE_3_3_2;
+ } else {
+ int i;
+ GLushort paletter[256], paletteg[256], paletteb[256];
+ for (i = 0; i < 256; i++) {
+ uint8_t rgb = ds->palette[i] >> 16;
+ paletter[i] = ((rgb & 0xe0) >> 5) * 65535 / 7;
+ paletteg[i] = ((rgb & 0x1c) >> 2) * 65535 / 7;
+ paletteb[i] = (rgb & 0x3) * 65535 / 3;
+ }
+ glPixelMapusv(GL_PIXEL_MAP_I_TO_R, 256, paletter);
+ glPixelMapusv(GL_PIXEL_MAP_I_TO_G, 256, paletteg);
+ glPixelMapusv(GL_PIXEL_MAP_I_TO_B, 256, paletteb);
+
+ tex_format = GL_COLOR_INDEX;
+ tex_type = GL_UNSIGNED_BYTE;
+ }
break;
case 16:
tex_format = GL_RGB;
tex_type = GL_UNSIGNED_SHORT_5_6_5;
- glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
break;
case 24:
tex_format = GL_BGR;
tex_type = GL_UNSIGNED_BYTE;
- glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
break;
case 32:
if (!ds->bgr) {
tex_format = GL_RGBA;
tex_type = GL_UNSIGNED_BYTE;
}
- glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
break;
}
glPixelStorei(GL_UNPACK_ROW_LENGTH, (ds->linesize * 8) / ds->depth);
return;
}
shared = SDL_CreateRGBSurfaceFrom(pixels, width, height, ds->depth, ds->linesize, rmask , gmask, bmask, amask);
+ if (ds->depth == 8 && ds->palette != NULL) {
+ SDL_Color palette[256];
+ int i;
+ for (i = 0; i < 256; i++) {
+ uint8_t rgb = ds->palette[i] >> 16;
+ palette[i].r = ((rgb & 0xe0) >> 5) * 255 / 7;
+ palette[i].g = ((rgb & 0x1c) >> 2) * 255 / 7;
+ palette[i].b = (rgb & 0x3) * 255 / 3;
+ }
+ SDL_SetColors(shared, palette, 0, 256);
+ }
ds->data = pixels;
}
static void sdl_colourdepth(DisplayState *ds, int depth)
{
- if (!depth || !ds->depth) return;
+ if (!depth || !ds->depth) {
+ ds->shared_buf = 0;
+ return;
+ }
ds->shared_buf = 1;
ds->depth = depth;
ds->linesize = width * depth / 8;
int width;
int height;
void *opaque;
+ uint32_t *palette;
uint64_t gui_timer_interval;
int switchbpp;
if (ds->depth == 32) return;
depth = 32;
break;
+ case 8:
case 0:
ds->shared_buf = 0;
return;